package main

import (
	"fmt"
	"net"
	"strings"
)

func main() {
	//监听
	listen, err := net.Listen("tcp", "127.0.0.1:8080")

	if err != nil {
		fmt.Println("err = ", err)
		return
	}
	defer listen.Close()

	for {
		//阻塞等待用户链接
		conn, err := listen.Accept()
		if err != nil {
			fmt.Println("err = ", err)
		}

		//处理用户的请求  新建一个协程
		go HandleConn(conn)
	}
}

// 处理用户请求
func HandleConn(conn net.Conn) {
	//函数执行结束自动关闭conn
	defer conn.Close()

	// 获取客户端的网络地址信息
	addr := conn.RemoteAddr().String()
	fmt.Println("addr connect successful", addr)

	buf := make([]byte, 2048)
	for {
		//读取用户数据
		read, err := conn.Read(buf)
		if err != nil {
			fmt.Println("err = ", err)
			return
		}

		s := string(buf[:read])
		fmt.Printf("[%s]： %s , len:  %d\n", addr, s, len(s))
		//fmt.Println("read buf = ", string(buf[:read]))

		if "exit" == string(buf[:read-2]) { // \r\n 占用俩位
			fmt.Println(addr, "  exit")
			return
		}

		//把数据转为大写，在给用户发送
		conn.Write([]byte(strings.ToUpper(s)))
	}
}
